﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.CapaDominio;
using Studio7i.CapaPersistencia;
using Studio7i.CapaPersistencia.DAO;


namespace Studio7i.CapaPruebas
{
   
    [TestFixture]
    public class TestReservaDAO
    {
        ISalaDAO salaDAO = null;
        IArmadoDeSalaDAO armadosalaDAO = null;
        IAdministradorDAO administradorDAO = null;
        ILocalDAO localDAO = null;
        IClienteDAO clienteDAO = null;
        IReservaDAO reservaDAO = null;
        IArmadoReservaDAO armadoreservaDAO = null;
        IInstrumentoDAO instrumentoDAO = null;
        IServicioDAO servicioDAO = null;
        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            armadosalaDAO = new ArmadoSalaDAO();
            foreach (ArmadoDeSala i in armadosalaDAO.ListarTodos()) armadosalaDAO.Eliminar(i);

            servicioDAO = new ServicioDAO();
            foreach (Servicio i in servicioDAO.ListarTodos()) servicioDAO.Eliminar(i);

            instrumentoDAO = new InstrumentoDAO();
            foreach (Instrumento i in instrumentoDAO.ListarTodos()) instrumentoDAO.Eliminar(i);

            administradorDAO = new AdministradorDAO();
            foreach (Administrador i in administradorDAO.ListarTodos()) administradorDAO.Eliminar(i);

            armadoreservaDAO = new ArmadoDeReservaDAO();
            foreach (ArmadoDeReserva i in armadoreservaDAO.ListarTodos()) armadoreservaDAO.Eliminar(i);

            reservaDAO = new ReservaDAO();
            foreach (Reserva i in reservaDAO.ListarTodos()) reservaDAO.Eliminar(i);

            clienteDAO = new CapaPersistencia.DAO.ClienteDAO();
            foreach (Cliente i in clienteDAO.ListarTodos()) clienteDAO.Eliminar(i);

            salaDAO = new CapaPersistencia.DAO.SalaDAO();
            foreach (Sala i in salaDAO.ListarTodos()) salaDAO.Eliminar(i);

            localDAO = new CapaPersistencia.DAO.LocalDAO();
            foreach (Local i in localDAO.ListarTodos()) localDAO.Eliminar(i);


            clienteDAO.Crear(new Cliente() { CoCliente = 1, NoCliente = "Jorge Luis Camarena Cueva", TxMail = "jlccsc19@hotmail.com", FeNacimiento = "05/10/1986", TxtClave = "1234" });
            clienteDAO.Crear(new Cliente() { CoCliente = 2, NoCliente = "Luis Alonso Camarena Juli", TxMail = "luismaximo2@gmail.com", FeNacimiento = "09/11/1987", TxtClave = "1234" });
            clienteDAO.Crear(new Cliente() { CoCliente = 3, NoCliente = "Juan Marcelo Marquez Yataco", TxMail = "juanmmy@hotmail.com", FeNacimiento = "24/09/1972", TxtClave = "1234" });

            localDAO.Crear(new Local() { NoLocal = "Monterrico", DiTxDireccionreccion = "Av. Primavera 123" });
            localDAO.Crear(new Local() { NoLocal = "Los Olivos", DiTxDireccionreccion = "Av. Las Palmeras 456" });
            localDAO.Crear(new Local() { NoLocal = "San Miguel", DiTxDireccionreccion = "Av. La MArina 1000" });

            salaDAO.Crear(new Sala() { NoSala = "Rock 80s", TxCaracteristicas = "Premium", QtCapacidad = 8, Local = new Local() { CoLocal = 1 }, TxComentario = "Zzz..." });
            salaDAO.Crear(new Sala() { NoSala = "Electrónico 90s", TxCaracteristicas = "VIP", QtCapacidad = 6, Local = new Local() { CoLocal = 2 } });
            salaDAO.Crear(new Sala() { NoSala = "Disco", TxCaracteristicas = "Black", QtCapacidad = 15, Local = new Local() { CoLocal = 3 } });

            reservaDAO.Crear(new Reserva() { FeInicio = "23-09-2011 08:00:00", FeFinal = "23-09-2011 10:00:00", SsReserva = 20, Sala = new Sala() { CoSala = 1 }, Cliente = new Cliente() { CoCliente = 1 }});
            reservaDAO.Crear(new Reserva() { FeInicio = "23-09-2011 12:00:00", FeFinal = "23-09-2011 14:00:00", SsReserva = 15, Sala = new Sala() { CoSala = 2 }, Cliente = new Cliente() { CoCliente = 2 }});
            reservaDAO.Crear(new Reserva() { FeInicio = "24-09-2011 08:00:00", FeFinal = "24-09-2011 12:00:00", SsReserva = 10, Sala = new Sala() { CoSala = 3 }, Cliente = new Cliente() { CoCliente = 3 }});
        }

        [Test]
        public void Test1_Crear_OK()
        {
            // 1. Implementar la prueba de creación exitosa
            Assert.IsNotNull(reservaDAO);

            // - Validar que no ocurra un error en la creación
            Reserva ReservaACrear = new Reserva();

            ReservaACrear.FeInicio = "24-09-2011 06:00:00";
            ReservaACrear.FeFinal = "24-09-2011 12:00:00";
            ReservaACrear.SsReserva = 20;
            ReservaACrear.Sala = new Sala() { CoSala = 1};
            ReservaACrear.Cliente = new Cliente() { CoCliente = 1};

            Reserva ReservaCreado = null;

            Assert.DoesNotThrow(delegate
            {
                ReservaCreado = reservaDAO.Crear(ReservaACrear);
                codigoGenerado = ReservaCreado.CoReserva;
            });

            // - Validar que el Reserva creado no sea nulo
            Assert.IsNotNull(ReservaCreado);

            // - Validar que el código generado para el Reserva sea mayor o igual a 4
            //Assert.GreaterOrEqual(ReservaCreado.CoReserva, 4);
        }

        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: ReservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Definimos los datos para la prueba
            int codigo = 1;
            // 3. Declaramos la entidad que contendrá el resultado
            Reserva ReservaObtenida = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                ReservaObtenida = reservaDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(ReservaObtenida);
        }
        [Test]
        public void Test3_Modificar()
        {
            // 1. Clase a probar: ReservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Reserva ReservaAModificar = reservaDAO.Obtener(2);
            ReservaAModificar.FeInicio = "24-09-2011 16:00:00";
            ReservaAModificar.FeFinal = "24-09-2011 20:00:00";
            ReservaAModificar.SsReserva = 25;
            ReservaAModificar.Sala = new Sala() { CoSala = 3};
            ReservaAModificar.Cliente = new Cliente() { CoCliente = 3};

            // 3. Declaramos la entidad que contendrá el resultado
            Reserva ReservaModificada = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                ReservaModificada = reservaDAO.Modificar(ReservaAModificar);  // 5. Ejecutamos el método a probar
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(ReservaModificada);
            // Probamos que el código generado sea igual 2
            Assert.AreEqual(ReservaModificada.CoReserva, 2);
            // Probamos que la fechainicio registrado es igual a la fechainicio solicitada con la entidad
            Assert.AreEqual(ReservaModificada.FeInicio, ReservaAModificar.FeInicio);
            // Probamos que la fechafinal registrada es igual a la fechafinal solicitada con la entidad
            Assert.AreEqual(ReservaModificada.FeFinal, ReservaAModificar.FeFinal);
        }
        [Test]
        public void Test4_Eliminar()
        {
            // 1. Clase a probar: ReservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Definimos la entidad que contendrá el resultado
            Reserva ReservaExistente = reservaDAO.Obtener(1);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                reservaDAO.Eliminar(ReservaExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(reservaDAO.Obtener(1));
        }
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: ReservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Reserva> ReservasEncontradas = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                ReservasEncontradas = reservaDAO.ListarTodos();
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(ReservasEncontradas);
            // Probamos que la cantidad de reservas encontrados sea mayor o igual que 2
            Assert.GreaterOrEqual(ReservasEncontradas.Count, 2);
            // Probamos que cada reserva contenga la cadena de búsqueda en su nombre
            foreach (Reserva ReservaEncontrada in ReservasEncontradas)
            {
                Assert.IsNotNull(ReservaEncontrada);
                Assert.IsInstanceOf(typeof(Reserva), ReservaEncontrada);
            }
        }
        [Test]
        public void Test6_ListarXBusqueda()
        {
            // 1. Clase a probar: ReservaDAO
            Assert.IsNotNull(reservaDAO);
            // 2. Definimos los datos para la prueba
            string feini = "24-09-2011 17:00:00"; //"24-09-2011 16:00:00"
            // 3. Declaramos la entidad que contendrá el resultado
            ICollection<Reserva> ReservasEncontradas = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                ReservasEncontradas = reservaDAO.ListarXBusqueda(null, feini, null, 0, null, null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(ReservasEncontradas);
        }
        
    }
}